Nix言語のAttribute Sets
こういう書き方をするが、これはsetsを引数にとって、setsを返す関数である 用語
Attribute Sets
例 s = { foo = "bar"; hoge = 2; }
雑にSetsと呼ぶこともあるmrsekut.icon
attribute
上の例でのfooとかhoge
雑にattrと呼ぶこともあるmrsekut.icon
value
上の例での"bar"とか2とか
ちゃんとしたNixの文書で実際に「value」と呼んでる箇所はまだ見たこと無いmrsekut.icon
が、たぶん合っているだろうmrsekut.icon
基本的なこと
こんな感じで定義する
code:nix-repl
s = { foo = "bar"; a-b = "baz"; "123" = "num"; }
各attributeはstringである必要がある
-も識別子に使える
これは別にAttribute Setsに限った話ではないmrsekut.icon
s.attrの形でアクセスする
code:nix-repl
nix-repl> s.foo
"bar"
nix-repl> s.a-b
"baz"
nix-repl> s."123"
"num"
valueは関数でも良い
code:nix-repl
nix-repl> { foo = a: a+2; }
{ foo = «lambda @ (string):1:9»; }
nix-repl> b.foo 3
5
mergeする
code:nix
nix-repl> {a=1;b=2;} // {c=3;}
{ a = 1; b = 2; c = 3; }
nix-repl> {a=1;b=2;} // {c=3;a=100;}
{ a = 100; b = 2; c = 3; }
JSの...objと同じmrsekut.icon
同じsets内で、他のattributeを参照する
recを付けるとできる
code:nix
{ a = 3; b = a+4; } # error
rec { a = 3; b = a+4; } # ok
bの内部でaを参照している
関数と組み合わせて使う
setsを引数にとる関数
code:nix-repl
nix-repl> mul = s: s.a*s.b # define
nix-repl> mul { a = 3; b = 4; } # call
12
hsのNamedFieldPunsバリにこうも書ける
code:nix-repl
nix-repl> mul = { a, b }: a*b # define
nix-repl> mul { a = 3; b = 4; } # call
12
引数に取るsetsのattrは完全に一致していないといけない
多くても少なくてもだめ
tsとは異なるmrsekut.icon
code:nix-repl
nix-repl> mul = { a, b }: a*b # define
nix-repl> mul { a = 3; b = 4; c = 6; } # call. cが過剰なのでerror
nix-repl> mul { a = 3; } # call. bが不足なのでerror
attrの過剰を許容する
...を使う
code:nix-repl
nix-repl> mul = { a, b, ... }: a*b # define
nix-repl> mul { a = 3; b = 4; c = 2; } # call
default引数
?を使う
code:nix-repl
nix-repl> mul = { a, b ? 2 }: a*b # define
nix-repl> mul { a = 3; } # call
6
hs同様@を使う
code:nix-repl
nix-repl> mul = s@{ a, b, ... }: a*b*s.c
nix-repl> mul { a = 3; b = 4; c = 2; }
24
builtins.isAttrs
引数がsetsかどうかを返す
code:nix-repl
nix-repl> builtins.isAttrs { foo = 2;}
true
builtins.attrNames
setsが持っているattrのlistを返す
code:nix-repl
nix-repl> builtins.attrNames { foo = 2; hoge = 3;}
builtins.toString
outPath属性の値を返す
ちょっと特殊な仕様mrsekut.icon
参考